`timescale 1ns / 1ps
/*----------------------------------------------------------------------------------------------*\
FileName        : cbb_dpram.v
Author          ：hpy
Email           ：yuan_hp@qq.com
Date            ：2024年01月07日
Description     ：双口RAM

cbb_dpram #(
    .DATA_DEPTH    ( 256 ) ,  // 数据深度 ， 存的数据个数
    .DATA_WIDTH    ( 8    ),  // 数据位宽
    .ADDR_WIDTH    ( 8    ),  // 地址位宽
    .ENABLE_ASYNC  ( 0    )   // 是否设置输出异步 1：EDA会使用逻辑单元模拟  0: eda大概率会调用memory
) u_cbb_dpram_2 (
	.address_a ( ) ,
	.address_b ( ) ,
	.clock     ( ) ,
	.data_a    ( ) ,
	.data_b    ( ) ,
	.wren_a    ( ) ,  // 高电平时写数据
	.wren_b    ( ) ,
	.q_a       ( ) ,
	.q_b       ( ) 
) ;
\*----------------------------------------------------------------------------------------------*/

module cbb_dpram_2 #(
    parameter DATA_DEPTH = 256 ,  // 数据深度 ， 存的数据个数
    parameter DATA_WIDTH = 8   ,  // 数据位宽
    parameter ADDR_WIDTH = 8   ,  // 地址位宽
    parameter ENABLE_ASYNC   = 0      // 是否设置输出异步
) (
	address_a,
	address_b,
	clock,
	data_a,
	data_b,
	wren_a,
	wren_b,
	q_a,
	q_b);

	input	[ADDR_WIDTH - 1:0]  address_a;
	input	[ADDR_WIDTH - 1:0]  address_b;
	input	  clock;
	input	[DATA_WIDTH - 1:0]  data_a;
	input	[DATA_WIDTH - 1:0]  data_b;
	input	  wren_a;
	input	  wren_b;
	output	 [DATA_WIDTH - 1:0]  q_a;
	output	 [DATA_WIDTH - 1:0]  q_b;

	(* ram_style="block_ram" *) reg [DATA_WIDTH - 1:0 ] _mem [0:DATA_DEPTH-1] /* synthesis syn_ramstyle = "block_ram" */; 

	always @(posedge clock) begin
		if(wren_a) 
			_mem[address_a] <= data_a ;
		else if (wren_b) 
			_mem[address_b] <= data_b ; 
	end	

generate
    genvar  i , j ;
	 reg [DATA_WIDTH - 1:0] q_a_r , q_b_r ;
	 
    if(|ENABLE_ASYNC) begin

        always @(*) begin
            q_a_r =  _mem[address_a];
            q_b_r =  _mem[address_b];
        end

    end else begin 
        
        always @(posedge clock ) begin
            if(~wren_a)q_a_r <= _mem[address_a] ;

            if(~wren_b)q_b_r <= _mem[address_b] ;
        end

    end 
	 
	for(i=0;i<DATA_WIDTH;i=i+1) begin :out_blk
       assign q_a[i] = q_a_r[i] ;
       assign q_b[i] = q_b_r[i] ;
   end
endgenerate

	
endmodule

 
 
